import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
const request = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/'
})

// 配置请求拦截器
request.interceptors.request.use(
  function(config) {
    // 获取token，配置token
    const tokenInfo = store.state.user.tokenInfo
    if (tokenInfo.token) {
      config.headers.Authorization = 'Bearer ' + tokenInfo.token
    }
    return config
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)
// 添加响应拦截器处理token过期
request.interceptors.response.use(
  function(response) {
  // 对响应数据做点什么
  // console.log('res', response)
    return response
  },
  async function (error) {
  // 对响应错误做点什么
  // console.dir(error)
    if (error.response.status === 401) {
      const tokenInfo = store.state.user.tokenInfo
      if (!tokenInfo.refresh_token) {
        // 没有刷新token
        // 清楚token
        store.commit('user/removeToken')
        // 跳转到登录router
        console.log(router)
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        // 给用户提示
        Toast.fail('登录信息过期')
        return
      }
      try {
        const res = await axios({
          method: 'put',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: 'Bearer ' + tokenInfo.refresh_token
          }
        })
        // 把新token存储到本地
        // console.log('res', res)
        // 更新token到vuex中
        store.commit('user/setToken', {
          token: res.data.data.token,
          refresh_token: tokenInfo.refresh_token
        })
        // 重新发送请求
        return request(error.config)
      } catch (err) {
        store.commit('user/removeToken')
        // 跳转到登录
        console.log(router)
        router.push({
          path: '/login',
          query: {
            back: router.currentRoute.fullPath
          }
        })
        Toast.fail('token过期，请重新登录')
      }
      // 给用户响应
    } else {
      return Promise.reject(error)
    }
  })
export default request
